/*******************************************************************/
/* @ All Rights Reserved Copyright (C) 2014 broada,Co.,Ltd.        */
/*                                                                 */
/*  NAME      = frtimer.c                                          */
/*  NOTE      = 时钟管理                                           */
/*  DATE      = 2014/11/29 yaohl                                   */
/*******************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>

#include <event2/event.h>
#include <event2/event_struct.h>

#include "frcomm.h"
#include "frmem.h"
#include "frlog.h"

#include "frtimer.h"

/*******************************************************************************
*  FUNC     :  初始化时钟管理
*  ARGS     :
*  RTN      :
*  NOTE     :
*******************************************************************************/
int frtimer_init(void)
{
    return FR_SUCC;
}


/*******************************************************************************
*  FUNC     :  生成一个新时钟
*  ARGS     :  base             (struct event_base *)
*           :  cb               (event_callback_fn)
*           :  arg              (参数)
*           :  tv               (延迟时间)
*  RTN      :  struct event *
*  NOTE     :
*******************************************************************************/
struct event *frtimer_new(struct event_base *base, event_callback_fn cb, void *arg, const struct timeval *tv)
{
    struct event *p_st_event=NULL;

    if(base==NULL || cb==NULL || tv == NULL)
        return NULL;

    p_st_event = evtimer_new(base, cb, arg);
    if(p_st_event == NULL)
    {
        FRLOG_ERROR_DETAIL("frmalloc fail");
        return NULL;
    }

    evtimer_add(p_st_event, tv);
    return p_st_event;
}

/*******************************************************************************
*  FUNC     :  增加时钟到evnet
*  ARGS     :  base             (struct event_base *)
*           :  tv               (struct timeval *)
*  RTN      :  evtimer_add的返回值
*  NOTE     :
*******************************************************************************/
int frtimer_add(struct event *ev, const struct timeval *tv)
{
    if(ev==NULL || tv == NULL)
        return FR_FAIL;

    evtimer_add(ev, tv);
    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  删除时钟
*  ARGS     :  ev             (struct event *)
*  RTN      :
*  NOTE     :
*******************************************************************************/
int frtimer_del(struct event *ev)
{
    if(ev==NULL)
        return FR_FAIL;

    if(event_pending(ev, EV_TIMEOUT, NULL))
        event_del(ev);
    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  时钟重新加载
*  ARGS     :  ev               (struct event *)
*           :  tv               (延迟时间)
*  RTN      :
*  NOTE     :
*******************************************************************************/
int frtimer_reload(struct event *ev, const struct timeval *tv)
{
    if(ev==NULL || tv == NULL)
        return FR_FAIL;

    if(event_pending(ev, EV_TIMEOUT, NULL))
        event_del(ev);
    evtimer_add(ev, tv);

    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  释放时钟
*  ARGS     :  base             (struct event_base *)
*  RTN      :
*  NOTE     :
*******************************************************************************/
int frtimer_free(struct event *ev)
{
    if(ev == NULL)
        return FR_FAIL;

    if(event_pending(ev, EV_TIMEOUT, NULL))
        event_del(ev);
    event_free(ev);

    return FR_SUCC;
}

/*******************************************************************************
*  FUNC     :  释放时钟管理
*  ARGS     :  
*  RTN      :  
*  NOTE     :
*******************************************************************************/
void frtimer_destory(void)
{
    return;
}

